package com.play2gether;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Raul on 6/04/14.
 */
public class formularioActivity extends ActionBarActivity implements View.OnClickListener {
    public  Button             btSalir;
    public  Button             btPerfil;
    public  Button             btVincular;
    public  Button             btJugar;
    public  Button             btKamasutra;
    public  Button             btOpciones;
    public  Button             btFormulario;

    public String[] estado;
    public String id_usuario;
    public int id_formulario;
    private DataBaseManager db;

    private LinearLayout base;
    private String respuestas;
    private int id_form_server;

    private ArrayList<TextView> lista = new ArrayList<TextView>();
    private ArrayList<RadioGroup>lista2 = new ArrayList<RadioGroup>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.formulario);

        Bundle bundle = getIntent().getExtras();
        id_usuario = bundle.getString("id");
        estado = bundle.getStringArray("estado");
        id_formulario = bundle.getInt("id_formulario");

        configurarVista();
        configurarNavbar();
    }
    private void configurarVista() {

        Button btEnviar   = (Button) findViewById(R.id.bt_enviar);
        Button btEliminar = (Button) findViewById(R.id.bt_eliminar);

        btEnviar.setOnClickListener(this);
        btEliminar.setOnClickListener(this);

        db = new DataBaseManager(this);
        Cursor c = db.obtenerFormulario(id_formulario);

        String textoTitulo = new String();  //Lo necesito fuera para llenar el textViw de la vista

        if (c.moveToFirst()) {
            do {
                int numTitulo      = c.getColumnIndex("titulo");
                int numId          = c.getColumnIndex("idFormServer");
                int numNumPregunta = c.getColumnIndex("numPregunta");
                int numPregunta    = c.getColumnIndex("pregunta");
                int numRespuestas  = c.getColumnIndex("respuestas");

                textoTitulo            = c.getString(numTitulo);
                id_form_server         = c.getInt(numId);
                int textoNumPregunta   = c.getInt(numNumPregunta);
                String textoPregunta   = c.getString(numPregunta);
                String textoRespuestas = c.getString(numRespuestas);

                TextView txtPregunta = new TextView(this.getApplicationContext(),null,android.R.attr.textAppearanceMedium);
                txtPregunta.setTextColor(Color.BLACK);
                txtPregunta.setTypeface(null, Typeface.BOLD);
                txtPregunta.setText(textoPregunta);

                String[] preguntas = textoRespuestas.split("-");

                RadioGroup rgPregunta = new RadioGroup(this);

                for (int i=0; i<preguntas.length;i++){
                    RadioButton rbP1resp = new RadioButton(this);
                    rbP1resp.setText(preguntas[i]);
                    rgPregunta.addView(rbP1resp);
                }
                lista.add(txtPregunta);
                lista2.add(rgPregunta);
            } while (c.moveToNext());
        }
        //db.deleteFormulario(id_formulario);

        TextView titulo = (TextView) findViewById(R.id.textTitulo);
        titulo.setText(textoTitulo);

        base = (LinearLayout) findViewById(R.id.base);

        int indexI=0;
        while (indexI<lista.size()){
            base.addView(lista.get(indexI));
            base.addView(lista2.get(indexI));
            indexI++;
        }

    }

    private void configurarNavbar() {
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        actionBar.setCustomView(R.layout.navbar);

        Button btFormularioNV = (Button) findViewById(R.id.btFormularioNV);
        Button btSugerenciaNV = (Button) findViewById(R.id.btSugerenciaNV);
        Button btOpcionesNV = (Button) findViewById(R.id.btOpcionesNV);
        Button btLogoNV = (Button) findViewById(R.id.btLogoNV);
        Button btAtras = (Button) findViewById(R.id.bt_atras);
        Button btSincronizar = (Button) findViewById(R.id.bt_sincronizar);

        TextView tituloNav = (TextView) findViewById(R.id.tituloLayout);
        tituloNav.setText("Formulario");

        //Botones para el navbar
        btOpcionesNV.setOnClickListener(this);
        if (!estado[0].equals("2")) {
            btFormularioNV.setAlpha(0);
            btSugerenciaNV.setAlpha(0);
        } else {
            btFormularioNV.setOnClickListener(this);
            btSugerenciaNV.setOnClickListener(this);
            btSincronizar.setAlpha(0);
        }
            btLogoNV.setOnClickListener(this);
            btAtras.setOnClickListener(this);
            btSincronizar.setOnClickListener(this);
            //btAtras.setAlpha(0);
            //btSincronizar.setAlpha(0);
            //btOpcionesNV.setAlpha(0);

        boolean haySugerencias = db.comprobarSugerencias(id_usuario);
        if (haySugerencias){ btSugerenciaNV.setBackground(this.getResources().getDrawable(R.drawable.bt_sugerencias_notificacion)); }
        else { btSugerenciaNV.setBackground(this.getResources().getDrawable(R.drawable.bt_sugerencia_nav)); }

        boolean hayFormularios = db.comprobarFormularios(id_usuario);
        if (hayFormularios){ btFormularioNV.setBackground(this.getResources().getDrawable(R.drawable.bt_formulario_notificacion)); }
        else { btFormularioNV.setBackground(this.getResources().getDrawable(R.drawable.bt_formulario_nav)); }
    }
    @Override
    public void onClick(View v) {
        Intent intent;
        intent = new Intent();

        switch (v.getId()) {

            case R.id.bt_enviar:
                respuestas = obtenerRespuestas();
                if (respuestas!=null) {
                    mostrarAlerta("¿Quieres continuar?", "Se enviarán los datos a play2gether y se eliminará el formulario de tu lista.", 1); }
                else                       {
                    mostrarAlertaDatosErroneos(); }
                break;
            case R.id.bt_eliminar: //db.borrar();
                mostrarAlerta("¿Quieres borrar el formulario?", "Se borrarán los datos de tu lista de formularios",2);
                break;
            //Botones para el natvar
            case R.id.btFormularioNV:
                intent.setClass(this,indexFormularios.class);
                intent.putExtra("id",id_usuario);
                intent.putExtra("estado",estado);
                finish();
                startActivity(intent);
                break;
            case R.id.btSugerenciaNV:
                intent.setClass(this,indexSugerencias.class);
                intent.putExtra("id",id_usuario);
                intent.putExtra("estado",estado);
                finish();
                startActivity(intent);
                break;
            case R.id.btOpcionesNV:
                intent.setClass(this,menuActivity.class);
                intent.putExtra("id",id_usuario);
                intent.putExtra("estado",estado);
                finish();
                startActivity(intent);
                break;
            case R.id.bt_atras:
                finish();
                break;
            case R.id.btLogoNV:
                finish();
                break;
            case R.id.bt_sincronizar:
                sincronizar();
                break;
        }
    }
    public void sincronizar(){
        Sincronizar sinc = new Sincronizar(id_usuario,this);
        sinc.sincronizar();

    }
    private String obtenerRespuestas(){
        Iterator i = lista2.iterator();
        String respuestas = new String();
        int cont=0;
        String[] preguntas = new String[lista2.size()];
        while(i.hasNext()){
            RadioGroup rd   = (RadioGroup)i.next();

            int index = rd.getCheckedRadioButtonId();
            RadioButton rb  = (RadioButton)rd.findViewById(index);
            try{
               preguntas[cont] = new String((String)rb.getText());
               if (cont>0){
                   respuestas = respuestas.concat("-").concat(preguntas[cont]);
               }else{
                   respuestas = preguntas[cont];
               }
            } catch (Exception e) {
                e.printStackTrace();
               return null;
            }
            cont++;
        }
        return respuestas;
    }
    private void mostrarAlerta(String titulo, String subtitulo, int tipo) {

        AlertDialog.Builder alertDialog = new AlertDialog.Builder(formularioActivity.this);
        alertDialog.setTitle(titulo);
        alertDialog.setMessage(subtitulo);
        if (tipo==1){
            //String url = "http://mediadomeprojects.com/arkdyanbyte/play2gether/public/cancelar_invitacion";
            alertDialog.setPositiveButton("ACEPTAR",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            try {
                                new EnviarFormulario().execute();
                            } catch (Exception e) {
                                e.printStackTrace();
                                Log.e("ERROR", e.getMessage());
                            }
                        }
                    }
            );
            alertDialog.setNegativeButton("CANCELAR",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }
            );
        }
        else {
            alertDialog.setPositiveButton("ACEPTAR", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        new CancelarFormulario().execute();
                    } catch (Exception e) {
                        e.printStackTrace();
                        Log.e("ERROR", e.getMessage());
                    }
                }
            });
            alertDialog.setNegativeButton("CANCELAR",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    }
            );
        }
        alertDialog.show();
    }
    private void mostrarAlertaDatosErroneos(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(formularioActivity.this);
        alertDialog.setTitle("No has completado el formulario");
        alertDialog.setMessage("Por favor rellena los campos que te faltan");
        alertDialog.setPositiveButton("VOLVER",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
        alertDialog.show();
    }
    public class EnviarFormulario extends AsyncTask<Void, Void, JSONObject> {

        String url="http://mediadomeprojects.com/arkdyanbyte/play2gether/public/enviar_formulario_completado";

        protected void onPreExecute(){
            Toast.makeText(getApplicationContext(), "Conectando con el servidor", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected JSONObject doInBackground(Void... JSONObject) { // Segunda función. Nos devuelve el parámetro que viene del post se modificará todo lo gráfico que se hace en primer plano.

            HttpClient cliente = new DefaultHttpClient();
            HttpPost htppost = new HttpPost(url);
            //BufferedReader bfr;
            String text = "Error";
            String result="";
            InputStream is = null;
            JSONObject json = null;
            List<NameValuePair> params;

            //Añadir parametros
            params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("id_usuario", id_usuario));
            params.add(new BasicNameValuePair("id_formulario", Integer.toString(id_form_server)));
            params.add(new BasicNameValuePair("respuestas", respuestas));

            try {
                htppost.setEntity(new UrlEncodedFormEntity(params));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            try {
                HttpResponse respuesta = cliente.execute(htppost);
                HttpEntity entity = respuesta.getEntity();
                is = entity.getContent();
                //text = EntityUtils.toString(entity);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
            } catch(Exception e){}

            try{
                json = new JSONObject(result);
            }catch(JSONException e){}

            return json;
        }
        protected void onPostExecute(JSONObject json){
            String estado = "";
            String asunto = "";

            try {
                estado = (String) json.get("estado");
                if (estado.equals("ok")){
                   boolean correcto = db.borrarFormulario(id_formulario,id_usuario);
                    if (!correcto){
                        Toast.makeText(getApplicationContext(),"Se ha producido un error al borrar los datos!!", Toast.LENGTH_SHORT).show();
                    }
                    mostrarAlertaInfo("Se ha enviado el formulario correctamente!!");
                } else {
                    Toast.makeText(getApplicationContext(),"No se ha enviado el formulario por error!!", Toast.LENGTH_SHORT).show();
                }
                //asunto = (String) json.get("asunto");
            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(), "No se ha enviado el formulario por error!!", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }

    }
    public class CancelarFormulario extends AsyncTask<Void, Void, JSONObject> {

        String url="http://mediadomeprojects.com/arkdyanbyte/play2gether/public/rechazar_formulario";

        protected void onPreExecute(){
            Toast.makeText(getApplicationContext(), "Conectando con el servidor", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected JSONObject doInBackground(Void... JSONObject) { // Segunda función. Nos devuelve el parámetro que viene del post se modificará todo lo gráfico que se hace en primer plano.

            HttpClient cliente = new DefaultHttpClient();
            HttpPost htppost = new HttpPost(url);
            //BufferedReader bfr;
            String text = "Error";
            String result="";
            InputStream is = null;
            JSONObject json = null;
            List<NameValuePair> params;

            //Añadir parametros
            params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("id_usuario", id_usuario));
            params.add(new BasicNameValuePair("id_formulario", Integer.toString(id_form_server)));

            try {
                htppost.setEntity(new UrlEncodedFormEntity(params));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

            try {
                HttpResponse respuesta = cliente.execute(htppost);
                HttpEntity entity = respuesta.getEntity();
                is = entity.getContent();
                //text = EntityUtils.toString(entity);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
            } catch(Exception e){}

            try{
                json = new JSONObject(result);
            }catch(JSONException e){}

            return json;
        }
        protected void onPostExecute(JSONObject json){
            String estado = "";
            String asunto = "";

            try {
                estado = (String) json.get("estado");
                if (estado.equals("ok")){
                    boolean correcto = db.borrarFormulario(id_formulario,id_usuario);
                    if (!correcto){ Toast.makeText(getApplicationContext(),"Se ha producido un error al borrar los datos!!", Toast.LENGTH_SHORT).show(); }
                    mostrarAlertaInfo("Se ha cancelado el formulario correctamente!!");
                } else {  Toast.makeText(getApplicationContext(),"No se ha cancelado el formulario por error!!", Toast.LENGTH_SHORT).show(); }
                //asunto = (String) json.get("asunto");
            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(), "No se ha cancelado el formulario por error!!", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            }
        }

    }
    private void mostrarAlertaInfo(String titulo) {

        AlertDialog.Builder alertDialog = new AlertDialog.Builder(formularioActivity.this);
        alertDialog.setTitle(titulo);
        alertDialog.setMessage("¿Quieres volver al listado de formularios?");
        alertDialog.setPositiveButton("Sí",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(formularioActivity.this, indexFormularios.class);
                intent.putExtra("id",id_usuario);
                intent.putExtra("estado",estado);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
        alertDialog.setNegativeButton("No",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent(formularioActivity.this, principalActivity.class);
                intent.putExtra("id",id_usuario);
                intent.putExtra("estado",estado);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
        alertDialog.show();
    }
}

